from rest_framework import serializers  #
from apps.lian.models import Student  # 导入学生模型
from apps.lian.models import Classes  # 导入班级模型
from rest_framework.serializers import StringRelatedField  # 自定义字段


# 第一种方式
# 定义一个序列化的类
# class StudentSerializer(serializers.Serializer): # 继承与serializers
#     # 返回哪些字段数据也带着数据校验
#     id = serializers.IntegerField(label='ID',read_only=True)  # read_only=True 只读 不能修改
#     name = serializers.CharField(label='姓名',max_length=20)  # 必须要带：max_length
#     age = serializers.IntegerField(label='年龄',required=False)   # 是否为空的已经在模型类里面已经声明了，所以在序列号这里不需要声明 required=False 非必填字段
#     sex = serializers.IntegerField(label='性别')
#     c_time = serializers.DateTimeField(label='创建时间')
#     x_time = serializers.DateTimeField(label='修改时间')
#     is_delete= serializers.BooleanField(label='逻辑删除')

# # 第二种方式
class StudentSerializer(serializers.ModelSerializer):
    # 自定义字段重写展示该字段  给前端  这个会把原本的表单给覆盖掉 一般不会怎么搞
    # classes = StringRelatedField(read_only=True)
    # 自定义字段：第二种 不能与字段名同名
    classes_name = serializers.CharField(read_only=True, source='classes.num')  # source= 资源

    # 类名与属性名都是固定的
    class Meta:  # 原模型
        # model 指哪个模型
        model = Student  # 模型
        # 展示哪些字段 ： __all__ 表示所有字段
        fields = '__all__'

        #  自定义校验分别有俩种
        # 年龄 最小于0---最大于200   extra_kwargs:给指定的属性添加或者修改参数
        # 第一种
        extra_kwargs = {
            # 属性
            'age': {
                'min_value': 0,  # 最小值
                'max_value': 200  # 最大值
            }
        }

    # 自定义校验：第二种:指定属性的值进行校验
    # validate_要校验的字段名
    # def validate_name(self,value):
    #     if 'python' not in value.lower():
    #             raise serializers.ValidationError('name error') # 踹出异常
    #
    #     return value

    # 自定义校验：获取所有属性的值都在attrs变量里面 是一个字典的类型(dict)
    # def validate(self,attrs):
    #     if 'python' not in attrs['name'].lower():
    #         raise serializers.ValidationError('name error')
    #
    #     return attrs


class TestSerializer(serializers.ModelSerializer):
    # 类名与属性名都是固定的
    class Meta:  # 原模型
        # model 指哪个模型
        model = Student  # 学生模型
        # 展示指定的字段 信息
        fields = ['id','name']  # 展示id与姓名字段


# 班级的序列化器
class ClassesSerializer(serializers.ModelSerializer):
    # 自定义字段：实现班级里面都有哪些学生
    # manager 是自定义的一个反向管理器名称
    # manager = StudentSerializer(read_only=True, many=True)  # 学生序列化
    # 第二种
    manager = TestSerializer(read_only=True,many=True)

    # 源类，类名与属性名都是固定的
    class Meta:
        model = Classes  # 模型
        fields = '__all__'  # 展示所有字段

    def validate_num(self, value):
        if 'python' not in value.lower():
            raise serializers.ValidationError('名称不符合规则')
        return value
